package mensagens;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import o2b.IStream;
import o2b.MarshallableException;
import cliente.tipos.ItemConta;

public class ManterItemConta extends Mensagem{
	private ItemConta i;
	
	private int numApto;
	
	private String nomeHospede;
	
	/**
	 * 1 - Inserir Serviço na conta
	 *  11 - Serviço incluído com sucesso na conta
	 *  12 - Apartamento não ocupado, verificar num apartamento
	 *  13 - Apartamento inexistente
	 */
	private int subTipo;
	
	/**
	 * Construtor Padrão
	 */
	public ManterItemConta() {
		tipo = TipoMensagem.MANTERITEMCONTA;
		setI(new ItemConta());
	}
	
	/**
	 * Construtor de mensagem específica
	 * @param subtipo 1 - Inserir Serviço na conta
	 *  11 - Serviço incluído com sucesso na conta
	 *  12 - Apartamento não ocupado, verificar num apartamento
	 *  13 - Apartamento inexistente
	 */
	public ManterItemConta(int subtipo) {
		tipo = TipoMensagem.MANTERITEMCONTA;
		setI(new ItemConta());
		setSubTipo(subtipo);
	}
	
	@Override
	public void marshal(IStream stream) throws MarshallableException {
		super.marshal(stream); 					// Envia o tipo da mensagem
		stream.write(getSubTipo());				// Envia o subtipo da mensagem
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");	// Cria um formatador de data
		
		// Avalia o subtipo da mensagem, para saber o que enviar
		/**
		 * 1 - Inserir Serviço na conta
		 *  11 - Serviço incluído com sucesso na conta
		 *  12 - Apartamento não ocupado, verificar num apartamento
		 *  13 - Apartamento inexistente
		 */
		switch(getSubTipo()){
			case 1:
				// Envia a descrição do serviço
				stream.write(i.getServico().getDescricao());
				// Envia a quantidade
				stream.write(i.getQuantidade());
				// Envia o valor
				stream.write(i.getValor());
				// Envia a data (cria um string com o resultado do formatados sobre a data
				stream.write(new String(sdf.format(i.getData())));
				// Envia o numero do apartamento
				stream.write(getNumApto());
				// Envia o nome do hospede
				stream.write(getNomeHospede());
				break;
				
			default:
				break;
		}
	}
	
	@Override
	public void unmarshal(IStream stream) throws MarshallableException {
		// Extrai o subtipo da mensagem
		setSubTipo(stream.readInt());
		
		// Cria um formato de data
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		
		// Trata o subtipo da mensagem
		/**
		 * 1 - Inserir Serviço na conta
		 *  11 - Serviço incluído com sucesso na conta
		 *  12 - Apartamento não ocupado, verificar num apartamento
		 *  13 - Apartamento inexistente
		 */
		switch(getSubTipo()){
		case 1:
			// Le a descrição do serviço
			getI().getServico().setDescricao((String)stream.readObject());
			// Le a quantidade
			getI().setQuantidade(stream.readInt());
			// Le o valor
			getI().setValor(stream.readDouble());
			// Le a data
			try{
				getI().setData(df.parse((String)stream.readObject()));
			} catch (ParseException e){
				e.printStackTrace();
			}
			
			// Lê o número do apartamento
			setNumApto(stream.readInt());
			
			// Extrai o nome do hóspede
			setNomeHospede((String)stream.readObject());
			break;
			
		case 2:
			break;
			
		default:
			break;
		
		}
	}

	public ItemConta getI() {
		return i;
	}

	public void setI(ItemConta i) {
		this.i = i;
	}
	/**
	 * 
	 * @return 1 - Inserir Serviço na conta
	 *  11 - Serviço incluído com sucesso na conta
	 *  12 - Apartamento não ocupado, verificar num apartamento
	 *  13 - Apartamento inexistente
	 */
	public int getSubTipo() {
		return subTipo;
	}

	public void setSubTipo(int subTipo) {
		this.subTipo = subTipo;
	}

	public void setNumApto(int numApto) {
		this.numApto = numApto;
	}

	public int getNumApto() {
		return numApto;
	}

	public void setNomeHospede(String nomeHospede) {
		this.nomeHospede = nomeHospede;
	}

	public String getNomeHospede() {
		return nomeHospede;
	}


}
